package com.bblocks.common.anti_reptile.config;


import com.bblocks.common.anti_reptile.config.bean.*;
import com.bblocks.common.anti_reptile.constant.RuleTypeEnum;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Jin
 * @since 2024/3/24
 */
@Data
@ConfigurationProperties(prefix = "anti.reptile")
public class AntiReptileProperties {

    /**
     * 是否启用反爬虫插件
     */
    private boolean enabled;

    /**
     * 是否启用全局拦截，默认为false，可设置为true全局拦截(全局拦截忽略includeUrls)
     */
    private boolean globalFilterMode = false;

    /**
     * 非全局拦截下，需要反爬的接口列表，以'/'开头，以','分隔
     */
    private List<String> includeUrls;


    /**
     * 同步参数
     */
    private Sync sync = new Sync();


    /**
     * 基于请求IP的反爬规则
     */
    private IpRule ipRule = new IpRule();

    /**
     * 基于请求User-Agent的反爬规则
     */
    private UaRule uaRule = new UaRule();


    /**
     * 基于用户统计反爬规则
     */
    private UserRule userRule = new UserRule();

    /**
     * 基于ip统计反爬规则
     */
    private IpPlusRule ipPlusRule = new IpPlusRule();

    /**
     * 全局流量
     */
    private WholeFlowRule wholeFlowRule = new WholeFlowRule();

    /**
     * 全局规则响应配置（）
     * 1、优先级低于 具体规则中配置参数
     * 2、仅当，url走特殊响应结果策略时生效
     * 3、如果未配置则直接使用本规则响应策略
     *
     * 例如：IpPlusRule 配置黑名单模式，但是具体一url配置的限流，则会使用此参数值，如果未配置则直接使用 IpPlusRule 的结果策略
     */
    private List<RuleResultParams> ruleResultParams = new ArrayList<>();

    /**
     * es参数
     */
    private Es es = new Es();

    /**
     * db 参数
     */
    private Db db = new Db();


    /**
     * 获取类型参数
     * @param ruleTypeEnum
     * @return
     */
    public RuleComm ruleByType(RuleTypeEnum ruleTypeEnum){
        switch (ruleTypeEnum){
            case IP:
                return ipRule;
            case UA:
                return uaRule;
            case USER:
                return userRule;
            case IP_PLUS:
                return ipPlusRule;
            case WHOLE_FLOW:
                return wholeFlowRule;
            default:
                return null;
        }
    }


}
